/*-------------------------------------------------------------------------
 *
 * pg_init_privs.h
 *	  "初始权限" 系统目录 (pg_init_privs) 的定义
 *
 * 注：一个对象通过主要定义该对象的行的 OID,
 * 以及该行所在表的 OID 来识别。
 * 例如，函数通过其 pg_proc 行的 OID 以及
 * pg_proc 表的 pg_class OID 来识别。这允许唯一
 * 标识对象，而不假设 OID 在表之间是唯一的。
 *
 * 由于属性没有自己的 OID，我们通过其父表的 objoid+classoid
 * 以及给定属性列号的 "objsubid" 来识别属性权限。
 * 表本身的权限中 "objsubid" 必须为零，以便与
 * 任何列权限区分。目前，objsubid 对于所有其他类型的
 * 对象都是未使用和零的。
 *
 * 由于此表的内容依赖于对系统中其他对象的操作
 * （特别是，可能由于 system_views.sql 中的更改而改变），
 * 因此没有 pg_init_privs.dat 文件。初始内容
 * 在 initdb 快结束时加载。
 *
 *
 * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * src/include/catalog/pg_init_privs.h
 *
 * NOTES
 *	  Catalog.pm 模块读取此文件并推导模式
 *	  信息。
 *
 *-------------------------------------------------------------------------
 */
#ifndef PG_INIT_PRIVS_H
#define PG_INIT_PRIVS_H

#include "catalog/genbki.h"
#include "catalog/pg_init_privs_d.h"

/* ----------------
 *		pg_init_privs 定义。 cpp 将其转换为
 *		typedef struct FormData_pg_init_privs
 * ----------------
 */
CATALOG(pg_init_privs,3394,InitPrivsRelationId)
{
	Oid			objoid;			/* 对象本身的 OID */
	Oid			classoid BKI_LOOKUP(pg_class);	/* 包含对象的表的 OID */
	int32		objsubid;		/* 列号，或 0 如果未使用 */
	char		privtype;		/* 是来自 initdb 还是扩展？ */

#ifdef CATALOG_VARLEN			/* 可变长度字段从这里开始 */
	aclitem		initprivs[1] BKI_FORCE_NOT_NULL;	/* 对象的初始权限 */
#endif
} FormData_pg_init_privs;

/* ----------------
 *		Form_pg_init_privs 与格式为 pg_init_privs 关系的元组指针相对应。
 * ----------------
 */
typedef FormData_pg_init_privs * Form_pg_init_privs;

DECLARE_TOAST(pg_init_privs, 4155, 4156);

DECLARE_UNIQUE_INDEX_PKEY(pg_init_privs_o_c_o_index, 3395, InitPrivsObjIndexId, on pg_init_privs using btree(objoid oid_ops, classoid oid_ops, objsubid int4_ops));

/*
 * 重要的是要知道初始权限是来自 initdb 还是来自扩展。
 * 这个枚举用于提供这样的区分，并且填充此表的两个地方（initdb 和 CREATE EXTENSION 期间，见
 * recordExtensionInitPriv()）知道使用正确的值。
 */

typedef enum InitPrivsType
{
	INITPRIVS_INITDB = 'i',
	INITPRIVS_EXTENSION = 'e'
} InitPrivsType;

#endif							/* PG_INIT_PRIVS_H */
